
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <string.h>

#include "share_memory.h"
#include "semaphore_t.h"

int main() {
	struct arr_data *share_data = NULL;
	void *shm = NULL;
	int semid = get_semaphoreid();
	int i;
	int shmid; 
    key_t key; 
  
    if((key = ftok("/root/ipc/shm_key_1", 1024)) < 0){
        perror("ftok error");
        return -1;
    }
  	
	// 1. 创建或者获取共享内存
    shmid = shmget(key, sizeof(struct arr_data), IPC_CREAT|0777);
	
	// 2. 将共享内存映射到进程的虚拟地址空间
	shm = shmat(shmid, (void*)0, 0);
	
	// 3. 将共享内存对应虚拟内存地址强转成 arr_data 类型的指针
	share_data = (struct arr_data*) shm;
	
	semaphore_p(semid);
	// 可以使用 share_data 指针操作共享内存了
	for(i = 0; i < share_data->arr_len; i++){
        printf("%d ", share_data->arr[i]);
    }
    printf("\n");
	semaphore_v(semid);

	// 5. 当共享内存使用完毕，我们可以通过 shmdt 解除它到虚拟内存的映射。
	shmdt(shm);
}
